<?php
// +----------------------------------------------------------------------
// | sfadmin - Suifeng Administration
// +----------------------------------------------------------------------
// | Copyright (c) 2017~2020 http://suifeng.tech All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: suifeng <1787585212@qq.com>
// +----------------------------------------------------------------------

namespace suifeng\utils;

class HtmlUtil
{
    /**
     * 必须包含内容的标签。这些标签不能简写。
     *
     * @var array
     */
    private static $must_content_tags = [
        'script',
        'i',
        'textarea',
        'select',
        'option',
        'div',
        'span',
    ];

    /**
     * 输出标签。
     *
     * @param string $tag
     * @param array $attributes
     * @param array $content
     * @return string
     */
    public static function render_tag($tag, $attributes = null, $content = null)
    {
        $output = '<' . $tag;

        if ($attributes) {
            $output .= ' ' . self::render_attributes($attributes);
        }

        if ($content !== null) {
            $output .= '>' . self::render_content($content) . '</' . $tag . '>';
        } else if (in_array($tag, self::$must_content_tags)) {
            $output .= '>' . self::render_end_tag($tag);
        } else {
            $output .= ' />';
        }

        return $output;
    }


    /**
     * 输出属性。
     *
     * @param mixed $attributes
     * @return string
     */
    public static function render_attributes($attributes = null)
    {
        $output = '';

        if (is_array($attributes)) {
            foreach ($attributes as $key => $value) {
                $output .= ($output != '' ? ' ' : '') . $key . '="' . preg_replace('/\"/', '&quot;', $value) . '"';
            }
        }

        return $output;
    }

    /**
     * 输出内容。
     *
     * @param mixed $content
     * @return string
     */
    public static function render_content($content = null)
    {
        if (!is_array($content)) {
            $content = array($content);
        }

        $output = '';

        foreach ($content as $child) {
            $output .= ($output != '' ? '' : '') . self::render_html($child);
        }

        return $output;
    }

    /**
     * 输出开始标签。
     *
     * @param unknown $tag
     * @param string $attributes
     * @return string
     */
    public static function render_start_tag($tag, $attributes = null)
    {
        $output = '<' . $tag;

        if ($attributes) {
            $output .= ' ' . self::render_attributes($attributes);
        }

        $output .= '>';
        return $output;
    }

    /**
     * 输出结束标签。
     *
     * @param unknown $tag
     * @return string
     */
    public static function render_end_tag($tag)
    {
        return '</' . $tag . '>';;
    }

    /**
     * 输出空标签。
     *
     * @param string $tag
     * @param string $attributes
     * @return string
     */
    public static function render_empty_tag($tag, $attributes = null)
    {
        return self::render_tag($tag, $attributes, '');
    }

    /**
     * 输出ICON。
     *
     * @param unknown $icon
     * @return string
     */
    public static function render_icon($icon)
    {
        return self::render_tag('i', array('class' => $icon), '');
    }

    /**
     * 添加CSS样式。
     *
     * @param unknown $attributes
     * @param unknown $css_class
     */
    public static function add_class(&$attributes, $css_class)
    {
        if (! isset($attributes['class'])) {
            $attributes['class'] = $css_class;
        } else {
            $attributes['class'] .= ' ' . $css_class;
        }

        return $attributes['class'];
    }

    /**
     * 输出对象HTML。
     * 如果对象有render_html()方法，则使用render_html()输出，
     * 否则使用__toString()输出。
     *
     * @param unknown $var
     * @return string
     */
    public static function render_html($var)
    {
        if (is_object($var) && method_exists($var, 'render_html')) {
            return $var->render_html();
        } else {
            return (string) $var;
        }
    }

    public static function anchor($text, $href, $class = null, $attributes = [])
    {
        $attributes['href'] = $href;
        $attributes['class'] = $class;
        return self::render_tag('a', $attributes, $text);
    }
}
